// 代码易读,
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

constexpr int K = 501; // 背包容量上限

// 全局变量
vector<int> w, v;                   // 物品重量和价值
vector<tuple<int, int, int>> query; // 查询：区间[l, r)和容量c
vector<ll> ans;                     // 存储每个查询的答案
vector<array<ll, K>> dp;            // DP数组

// 分治函数：处理区间[l, r)内的查询
void work(int l, int r, const vector<int> &id) {
  // 基本情况：区间长度为1
  if (l + 1 == r) {
    for (auto i : id) {
      int L, R, C;
      tie(L, R, C) = query[i];
      // 单个物品：如果能装下就取价值，否则为0
      ans[i] = C >= w[L] ? v[L] : 0;
    }
    return;
  }

  int m = (l + r) / 2; // 中点

  // 计算左半部分的DP：从m-1向左到l
  for (int i = m - 1; i >= l; i--) {
    for (int j = 0; j < K; j++) {
      if (i == m - 1) {
        // 边界情况：单个物品
        dp[i][j] = j >= w[i] ? v[i] : 0;
      } else {
        // 不选当前物品
        dp[i][j] = dp[i + 1][j];
        if (j >= w[i]) {
          // 选当前物品，取最大值
          dp[i][j] = max(dp[i][j], dp[i + 1][j - w[i]] + v[i]);
        }
      }
    }
  }

  // 计算右半部分的DP：从m向右到r-1
  for (int i = m; i < r; i++) {
    for (int j = 0; j < K; j++) {
      if (i == m) {
        // 边界情况：单个物品
        dp[i][j] = j >= w[i] ? v[i] : 0;
      } else {
        // 不选当前物品
        dp[i][j] = dp[i - 1][j];
        if (j >= w[i]) {
          // 选当前物品，取最大值
          dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]);
        }
      }
    }
  }

  // 分类处理查询
  vector<int> idl, idr; // 左半区和右半区的查询索引
  for (auto i : id) {
    int L, R, C;
    tie(L, R, C) = query[i];
    if (R <= m) {
      // 查询完全在左半区
      idl.push_back(i);
    } else if (L >= m) {
      // 查询完全在右半区
      idr.push_back(i);
    } else {
      // 查询跨越中点：合并左右两部分的解
      for (int j = 0; j <= C; j++) {
        // 将容量j分配给左半部分，C-j分配给右半部分
        ans[i] = max(ans[i], dp[L][j] + dp[R - 1][C - j]);
      }
    }
  }

  // 递归处理左右子区间
  work(l, m, idl);
  work(m, r, idr);
}

int main() {
  // 优化输入输出
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);

  int n; // 物品数量
  cin >> n;

  // 初始化全局变量
  w.resize(n);
  v.resize(n);
  dp.resize(n);

  // 读取每个物品的重量和价值
  for (int i = 0; i < n; i++) {
    cin >> w[i] >> v[i];
  }

  int q; // 查询数量
  cin >> q;

  // 初始化查询数组
  query.resize(q);
  ans.resize(q);

  // 读取查询
  for (int i = 0; i < q; i++) {
    int l, r, c;
    cin >> l >> r >> c;
    l--; // 转换为0-indexed
    query[i] = make_tuple(l, r, c);
  }

  // 初始化所有查询索引
  vector<int> p(q);
  for (int i = 0; i < q; i++) {
    p[i] = i;
  }

  // 开始分治处理
  work(0, n, p);

  // 输出所有查询结果
  for (int i = 0; i < q; i++) {
    cout << ans[i] << "\n";
  }

  return 0;
}

// 参考链接：https://zhuanlan.zhihu.com/p/1957939610089923619